function defineReactive(obj, key, value) {
  // 递归,作用: obj里面第二层开始是对象
  observe(value)
  Object.defineProperty(obj, key, {
    // 闭包的应用
    get() {
      console.log('get', value)
      return value
    },
    set (newValue) {
      if (newValue === value) {
        return
      }
      console.log('set key', key)
      console.log('set value', newValue)
      // 递归,作用: obj中对key赋值的时候,直接赋值,而没有使用.进行赋值,newValue是对象
      observe(newValue)
      value = newValue
    }
  })
}

function observe(obj) {
  if (typeof obj !== 'object' || obj === null) return
  Object.keys(obj).forEach(key => {
    defineReactive(obj, key, obj[key])
  })
}

const obj = {
  // name: '',
  age: {
    a: 0
  }
}
observe(obj)
// obj.name = 'zhangsan'
obj.age.a = 21
